package android.matrix;


/**
 * La interfase <code>MatrixOps</code> adiciona a las subclases de <code>AbstractMatrix</code> con la 
 * capacidad de realizar operaciones con las matrices contenidas en ellas. Esta interfase agrega las 
 * operaciones de Suma, Resta, Multiplicación, Transposición y Escalamiento de matrices.
 * 
 * @author Rafael Asprilla
 *
 */
public interface MatrixOps {
	
	/**
	 * El método <code>transpose()</code> genera la matriz transpuesta del objeto actual.
	 * 
	 * @return
	 * Devuelve una variable de tipo <code>AbstractMatrix</code> que es la trampuesta del objeto actual.
	 */
	public abstract AbstractMatrix transpose();
	
	/**
	 * El método <code>mult(AbstractMatrix)</code> genera una matriz con la multiplicación de la 
	 * matriz actual (A) y una que se pasa como argumento (B). A es una matriz i x k mientras 
	 * que B tiene que ser una matriz k x j para que la funcion no devuelva <code>null</code>. 
	 * De este modo A * B  = C que será una matriz i x j.
	 * 
	 * @param b
	 * Matriz k x j que se multiplicará con la matriz actual.
	 * @return
	 * Devuelve una variable tipo <code>AbstractMatrix</code>  de tamaño i x j 
	 * con la multiplicación de A y B.
	 */
	public abstract AbstractMatrix mult(AbstractMatrix b);
	
	/**
	 * El método abstracto <code>sum(AbstractMatrix)</code> genera una matriz con la suma de la 
	 * matriz actual (A) y una que se pasa como argumento (B). A y B deben ser del mismo tamaño 
	 * i x k para que este método no devuelva <code>null</code>. De este modo A + B = C que es 
	 * una matriz i x k.
	 * 
	 * @param b
	 * Matriz i x k que se sumará a la matriz actual.
	 * @return
	 * Devuelve una variable tipo <code>AbstractMatrix</code> de tamaño i x k con la suma de
	 * A y B.
	 */
	public abstract AbstractMatrix sum(AbstractMatrix b);
	
	/**
	 * El método abstracto <code>sub(AbstractMatrix)</code> genera una matriz con la suma de la 
	 * matriz actual (A) y una que se pasa como argumento (B). A y B deben ser del mismo tamaño 
	 * i x k para que este método no devuelva <code>null</code>. De este modo A - B = C que es 
	 * una matriz i x k.
	 * 
	 * @param b
	 * Matriz i x k que se sumará a la matriz actual.
	 * @return
	 * Devuelve una variable tipo <code>AbstractMatrix</code> de tamaño i x k con la resta de
	 * A menos B.
	 */
	public abstract AbstractMatrix sub(AbstractMatrix b);
	
	/**
	 * El método abstracto <code>scalar(float)</code> realiza una multiplicación escalar de la 
	 * matriz actual, al multiplicarla por una constante de tipo flotante. De este modo c x A = C,
	 * donde C es un múltiplo de A. A puede ser de cualquier tamaño i x k.
	 * 
	 * @param c
	 * Constante de tipo flotante qe multiplica a la matriz actual.
	 * 
	 * @return
	 * Devualve una variable de tipo <code>AbstractMatrix</code> múltiplo de A.
	 */
	public abstract AbstractMatrix scalar(float c);
}
